package cn.genmer.test.security.algorithm;

import cn.genmer.test.security.algorithm.entity.IntExtend;
import cn.genmer.test.security.algorithm.sort.BubbleSort;
import cn.genmer.test.security.algorithm.sort.SelectSort;

import java.util.Arrays;

/**
 * 算法稳定性校验
 * 算法稳定性：在一组待排序记录中，如果存在任意两个相等的记录 R 和 S，且在待排序记录中 R 在 S 前，
 * 如果在排序后 R 依然在 S 前，即它们的前后位置在排序前后不发生改变，则称为排序算法为稳定的。
 *
 * 思路就是, 普通数据结构无法得知哪个是哪个,我们可以用一组值一样的对象,记录额外的下标数据
 */
public class algorithmValidationStability {
    public static void main(String[] args) {
        check();
    }

    public static void check(){
        boolean result = true;
        IntExtend[] arr = generateSameArray();
        IntExtend[] arr2 = Arrays.copyOf(arr, arr.length);
        IntExtend[] originArr = Arrays.copyOf(arr, arr.length);

        BubbleSort.sort2(arr);
        SelectSort.sort2(arr2);

        boolean same = true;
        for(int i=0; i<arr.length; i++){
            if (arr[i].getIndex() != arr2[i].getIndex()) same = false;
        }
        System.out.println("---------------------------------------");
        System.out.print("测试用例: ");
        SelectSort.printArray(originArr);
        System.out.println();
        System.out.print("正确用例: ");
        SelectSort.printArray(arr);
        System.out.println();
        System.out.print("错误用例: ");
        SelectSort.printArray(arr2);
        System.out.println("---------------------------------------");
        if (!same) {
            result = false;
            System.out.println("error");

            return;
        }

        if (result)
            System.out.println("right");
    }

    /**
     * 生成一股相同的数值
     * @return
     */
    private static IntExtend[] generateSameArray(){
        IntExtend[] randoms = new IntExtend[10];
        for (int i=0; i< randoms.length; i++){
            randoms[i] = new IntExtend(1, i);
        }

        return randoms;
    }
}
